//
//  UIViewAnimation_Propertys.m
//  UIView_Animation
//
//  Created by globalives2 on 2017/2/20.
//  Copyright © 2017年 globalives2. All rights reserved.
//

#import "UIViewAnimation_Propertys.h"

@interface UIViewAnimation_Propertys ()

// 积分 view
@property (nonatomic, strong) UIView *integralView;
// 卡券 view
@property (nonatomic, strong) UIView *toView;
// 签到 view
@property (nonatomic, strong) UIView *fromView;

@end

@implementation UIViewAnimation_Propertys

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

# pragma mark - *********************UIViewAnimation 动画参数的设置方法 ************************
- (void)viewAnimation {
    /** UIView动画可以设置的动画属性有:
     1、大小变化(frame)
     2、拉伸变化(bounds)
     3、中心位置(center)
     4、旋转(transform)
     5、透明度(alpha)
     6、背景颜色(backgroundColor)
     7、拉伸内容(contentStretch)
     */
    
    /**
     动画开始标记
     
     @param NSString 动画标识
     @return 附加参数，在设置了代理的情况下，此参数将发送到setAnimationWillStartSelector和setAnimationDidStopSelector所指定的方法。大部分情况下，我们设置为nil即可。
     */
    [UIView beginAnimations:@"FrameAni" context:nil];
    
    /**
     动画持续时间
     */
    [UIView setAnimationDuration:1.0];
    
    //动画的代理对象
    [UIView setAnimationDelegate:self];
    
    //设置动画将开始时代理对象执行的SEL
    [UIView setAnimationWillStartSelector:@selector(startAni:)];
    
    //设置动画结束时代理对象执行的SEL
    [UIView setAnimationDidStopSelector:@selector(stopAni:)];
    
    //设置动画的重复次数
    [UIView setAnimationRepeatCount:1];
    
    //设置动画的曲线
     
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut //UIViewAnimationCurve
     ];
    /// 结束动画标记
    [UIView commitAnimations];
    
    //设置动画延迟执行的时间
    [UIView setAnimationDelay:1];
    //设置是否从当前状态开始播放动画
    [UIView setAnimationBeginsFromCurrentState:YES];
    /*假设上一个动画正在播放，且尚未播放完毕，我们将要进行一个新的动画：
     当为YES时：动画将从上一个动画所在的状态开始播放
     当为NO时：动画将从上一个动画所指定的最终状态开始播放（此时上一个动画马上结束）*/
    
    //设置动画是否继续执行相反的动画
    [UIView setAnimationRepeatAutoreverses:YES];
    //是否禁用动画效果（对象属性依然会被改变，只是没有动画效果）
    [UIView setAnimationsEnabled:YES];
    
    //设置视图的过渡效果
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft //(UIViewAnimationTransition)
                       forView:self.integralView //需要过渡效果的View
                         cache:YES //是否使用视图缓存，YES：视图在开始和结束时渲染一次；NO：视图在每一帧都渲染
     ];
    
    
}

- (void)UIViewAnimationCurve {
    /**
    UIViewAnimationCurveEaseInOut,         // 慢进慢出（默认值）
    UIViewAnimationCurveEaseIn,            // 慢进
    UIViewAnimationCurveEaseOut,           // 慢出
    UIViewAnimationCurveLinear             // 匀速
     */
}

- (void)UIViewAnimationTransition {
    /**
    UIViewAnimationTransitionNone,              //不使用动画
    UIViewAnimationTransitionFlipFromLeft,      //从左向右旋转翻页
    UIViewAnimationTransitionFlipFromRight,     //从右向左旋转翻页
    UIViewAnimationTransitionCurlUp,            //从下往上卷曲翻页
    UIViewAnimationTransitionCurlDown,          //从上往下卷曲翻页
     */
}

#pragma mark ******************Block动画方法**********************
- (void)UIViewAnimation_Block {
    // 1、最简洁的Block动画：包含时间和动画
    
    [UIView animateWithDuration:1.0  //动画持续时间
                     animations:^{
                         //执行的动画
                     }];
    
    // 2、带有动画完成回调的Block动画
    
    [UIView animateWithDuration:1.0  //动画持续时间
                     animations:^{
                         //执行的动画
                     }
                     completion:^(BOOL finished) {
                         //动画执行完毕后的操作
                     }];
    
    // 3、可设置延迟时间和过渡效果的Block动画
    
    [UIView animateWithDuration:1.0 //动画持续时间
                          delay:0.5 //动画延迟执行的时间
                        options:UIViewAnimationOptionLayoutSubviews //动画的过渡效果
                     animations:^{
                         //执行的动画
                     }
                     completion:^(BOOL finished) {
                         //动画执行完毕后的操作
                     }];
    
    // 4、Spring动画
    // iOS7.0后新增Spring动画（iOS系统动画大部分采用Spring Animation，适用于所有可被添加动画效果的属性）
    
    [UIView animateWithDuration:1.0 //动画持续时间 1.0s
                          delay:0.5 //动画延迟执行的时间
         usingSpringWithDamping:0.5 //震动效果，范围0~1，数值越小震动效果越明显
          initialSpringVelocity:0.5 //初始速度，数值越大初始速度越快
                        options:UIViewAnimationOptionAutoreverse //(UIViewAnimationOptions)动画的过渡效果
                     animations:^{
                         //执行的动画
                     }
                     completion:^(BOOL finished) {
                         //动画执行完毕后的操作
                     }];
    
    // 5、Keyframes动画
    //iOS7.0后新增关键帧动画，支持属性关键帧，不支持路径关键帧
    
    [UIView animateKeyframesWithDuration:1.0//动画持续时间
                                   delay:0.5//动画延迟执行的时间
                                 options:UIViewKeyframeAnimationOptionCalculationModeLinear//(UIViewKeyframeAnimationOptions)动画的过渡效果
                              animations:^{
                                  //执行的关键帧动画
                              }
                              completion:^(BOOL finished) {
                                  //动画执行完毕后的操作
                              }];
    
    //增加关键帧的方法：
    
    [UIView addKeyframeWithRelativeStartTime:0.1//动画开始的时间（占总时间的比例）
                            relativeDuration:1.0 //动画持续时间（占总时间的比例）
                                  animations:^{
                                      //执行的动画
                                  }];
    
    
    //6、转场动画
    //6.1 从旧视图转到新视图的动画效果
    
    [UIView transitionFromView:self.fromView //(nonnull UIView *)旧视图
                        toView:self.toView//(nonnull UIView *)新视图
                      duration:1.0 //动画持续时间
                       options:UIViewAnimationOptionRepeat//(UIViewAnimationOptions)动画的过渡效果
                    completion:^(BOOL finished) {
                        //动画执行完毕后的操作
                    }];
    //在该动画过程中，fromView 会从父视图中移除，并讲 toView 添加到父视图中，注意转场动画的作用对象是父视图（过渡效果体现在父视图上）。
    //调用该方法相当于执行下面两句代码：
    [self.fromView.superview addSubview:self.toView];
    [self.fromView removeFromSuperview];
    
    //6.2 单个视图的过渡效果
    
    [UIView transitionWithView: self.integralView//(nonnull UIView *)
                      duration:1.0//(NSTimeInterval)动画持续时间
                       options:UIViewAnimationOptionRepeat//(UIViewAnimationOptions)动画的过渡效果
                    animations:^{
                        //执行的动画
                    }
                    completion:^(BOOL finished) {
                        //动画执行完毕后的操作
                    }];
}


/// 动画的过渡效果
- (void)UIViewAnimationOptions {
    /**
    UIViewAnimationOptions                         //的枚举值如下，可组合使用：
    UIViewAnimationOptionLayoutSubviews            //进行动画时布局子控件
    UIViewAnimationOptionAllowUserInteraction      //进行动画时允许用户交互
    UIViewAnimationOptionBeginFromCurrentState     //从当前状态开始动画
    UIViewAnimationOptionRepeat                    //无限重复执行动画
    UIViewAnimationOptionAutoreverse               //执行动画回路
    UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画的执行时间设置
    UIViewAnimationOptionOverrideInheritedCurve    //忽略嵌套动画的曲线设置
    UIViewAnimationOptionAllowAnimatedContent      //转场：进行动画时重绘视图
    UIViewAnimationOptionShowHideTransitionViews   //转场：移除（添加和移除图层的）动画效果
    UIViewAnimationOptionOverrideInheritedOptions  //不继承父动画设置
    
    UIViewAnimationOptionCurveEaseInOut            //时间曲线，慢进慢出（默认值）
    UIViewAnimationOptionCurveEaseIn               //时间曲线，慢进
    UIViewAnimationOptionCurveEaseOut              //时间曲线，慢出
    UIViewAnimationOptionCurveLinear               //时间曲线，匀速
    
    UIViewAnimationOptionTransitionNone            //转场，不使用动画
    UIViewAnimationOptionTransitionFlipFromLeft    //转场，从左向右旋转翻页
    UIViewAnimationOptionTransitionFlipFromRight   //转场，从右向左旋转翻页
    UIViewAnimationOptionTransitionCurlUp          //转场，下往上卷曲翻页
    UIViewAnimationOptionTransitionCurlDown        //转场，从上往下卷曲翻页
    UIViewAnimationOptionTransitionCrossDissolve   //转场，交叉消失和出现
    UIViewAnimationOptionTransitionFlipFromTop     //转场，从上向下旋转翻页
    UIViewAnimationOptionTransitionFlipFromBottom  //转场，从下向上旋转翻页
     */
}

/// 动画的过渡效果
- (void)UIViewKeyframeAnimationOptions {
    /**
    UIViewAnimationOptionLayoutSubviews           //进行动画时布局子控件
    UIViewAnimationOptionAllowUserInteraction     //进行动画时允许用户交互
    UIViewAnimationOptionBeginFromCurrentState    //从当前状态开始动画
    UIViewAnimationOptionRepeat                   //无限重复执行动画
    UIViewAnimationOptionAutoreverse              //执行动画回路
    UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画的执行时间设置
    UIViewAnimationOptionOverrideInheritedOptions //不继承父动画设置
    
    UIViewKeyframeAnimationOptionCalculationModeLinear     //运算模式 :连续
    UIViewKeyframeAnimationOptionCalculationModeDiscrete   //运算模式 :离散
    UIViewKeyframeAnimationOptionCalculationModePaced      //运算模式 :均匀执行
    UIViewKeyframeAnimationOptionCalculationModeCubic      //运算模式 :平滑
    UIViewKeyframeAnimationOptionCalculationModeCubicPaced //运算模式 :平滑均匀
     */
}
@end
